import api from '../api/index'

let configData={};


/**
 * @func 存储当前应用的appId
 */
const setAppId = (params) => {
  sessionStorage.setItem('JSAPPID', params);
}



/**
 * @func 获取当前应用的appId
 */
const getAppId = () => {
  return sessionStorage.getItem('JSAPPID');
}



/**
 * @func 加载 jweixin api资源
 */
const loadJweixinJS = () => {
  return new Promise(async (resolve, reject) => {
    let head = document.getElementsByTagName('head')[0]
    let script = document.createElement('script')
    script.src = 'http://res.wx.qq.com/open/js/jweixin-1.4.0.js'
    head.appendChild(script)
    script.onload = function () { 
      console.log('weixinJS script loaded >>>', window.wx)
      resolve(true)
    } 
  })
}


/**
 * @func 加载 eruda
 */
 const initEruda = () => {
  const showEruda = ()=> {
    const script = document.createElement('script'); 
    script.src = "https://unpkg.com/vconsole@latest/dist/vconsole.min.js"; 
    script.async = true
    document.getElementsByTagName('head')[0].appendChild(script)
    script.onload = function () { 
      const vConsole  = new VConsole();
      sessionStorage.setItem("JSEruda", "true");
    } 
  }
  if(sessionStorage.getItem("JSEruda") === 'true') {
    showEruda();
  }
  // 记录点击次数
  let clickCount = 0;
  // 设置连点监听
  document.addEventListener('click', ()=> {
    clickCount++;
    if(clickCount === 10) {
      showEruda();
      clearInterval(initCount);
    }
  })
  
  const initCount = setInterval(()=> {
    clickCount = 0;
  }, 3000)
}





/**
 * @func config接口注入权限验证配置
 * @param {boolean} beta 调用wx.invoke形式的接口值时，该值必须为true
 * @param {boolean} debug 开启调试模式,调用的所有api的返回值会在客户端alert出来，若要查看传入的参数，可以在pc端打开，参数信息会通过log打出，仅在pc端时才会打印
 * @param {string} appId 必填，cropID
 * @param {number} timestamp 必填，生成签名的时间戳
 * @param {string} nonceStr 必填，生成签名的随机串
 * @param {string} signature 必填，签名，见附3（在线应用需要获取,离线应用写死即可）
 * @param {array} jsApiList 必填，需要使用的JS接口列表，所有JS接口列表见附录2
 */
 const wxConfig = (params) => {
  initEruda();
    return new Promise(async (resolve, reject) => {
      const weixinJS = await loadJweixinJS()
      if (params) setAppId(params)
      const appId = getAppId() || params
      const res = await api.apiTicket(appId)
      configData = {
        timestamp: res.data.timestamp,
        nonceStr: res.data.nonceStr
      };
      if(!window.wx){
        configAgain(res);
        resolve({
          config: 'config:error',
          msg: 'jweixin挂载失败，自动重试3次,config:ready出现即挂载成功'
        })
      } else {
        wx.config({
          beta: true,
          debug: false,
          appId: res.data.appId,
          timestamp: res.data.timestamp,
          nonceStr: res.data.nonceStr,
          signature: res.data.signature,
          jsApiList: ['selectEnterpriseContact', 'getAllPhoneContacts', 'openUserProfile', 'addCalendarEvent', 'getStepCount', 'openChatWithMsg', 'startAutoLBS', 'stopAutoLBS'], // 必填，需要使用的JS接口列表
        })
        wx.ready(function (res) {
          console.log("config:ready")
          resolve({
            config: 'ready',
            msg: res
          })
        });
        wx.error(function (err) {
          console.log("config:error")
          resolve({
            config: 'error',
            msg: err
          })
        })
      }
    })
}



/**
 * @func config接口注入权限验证配置重试接口
 * @param {string} appId 必填，cropID
 * @param {number} timestamp 必填，生成签名的时间戳
 * @param {string} nonceStr 必填，生成签名的随机串
 * @param {string} signature 必填，签名，见附3（在线应用需要获取,离线应用写死即可）
 * @param {array} jsApiList 必填，需要使用的JS接口列表，所有JS接口列表见附录2
 */
const configAgain = (res) => {
    const handle = setInterval(()=> {
      console.log("重试中...")
      if(!window.wx){
        loadJweixinJS();
      }else {
        wx.config({
          beta: true,
          debug: false,
          appId: res.data.appId,
          timestamp: res.data.timestamp,
          nonceStr: res.data.nonceStr,
          signature: res.data.signature,
          jsApiList: ['selectEnterpriseContact', 'getAllPhoneContacts', 'openUserProfile', 'addCalendarEvent', 'getStepCount', 'openChatWithMsg', 'startAutoLBS', 'stopAutoLBS'], // 必填，需要使用的JS接口列表
        })
        wx.ready(function (res) {
          console.log("config:ready")
        });
        wx.error(function (err) {
          console.log("config:error")
        })
      }
    }, 1000)
    setTimeout(() => clearInterval(handle), 3100)
}



/**
 *  @func 通过agentConfig注入应用权限
 *  @desc 调用agentConfig之前，必须确保先成功调用config
 *  @param {string} agentid 必填，企业应用的agentid
 *  @param {string} corpid 必填，corpid
 *  @param {number} timestamp 必填，生成签名的时间戳,int类型, 如 1539100800
 *  @param {string} nonceStr 必填，生成签名的随机串
 *  @param {string} signature 必填，签名，见附4（在线应用需要获取,离线应用写死即可）
 *  @returns {Promise} 返回一个Promise
 */
const agentConfig = (params) => {
  return new Promise(async (resolve, reject) => {
    if (params) setAppId(params)
    const appId = getAppId() || params
    const res = await api.agentApiTicket(appId, configData)
    wx.invoke('agentConfig', {
      agentid: res.data.agentId,
      corpid: res.data.corpId,
      timestamp: res.data.timestamp,
      nonceStr: res.data.nonceStr,
      signature: res.data.signature,
    }, function (res) {
      console.log('agentConfig----', res)
      resolve(res)
      // 这里可以调用用户数据接口
    })
  })
}



/**
 * @func 判断当前客户端版本是否支持指定JS接口
 * @param {Object} query 请求参数
 * @param {array} jsApiList 需要使用的JS接口列表，所有JS接口列表见附录2, 例如 ['chooseImage']
 * @returns {Promise} 返回一个Promise，以键值对的形式返回，可用的api值true，不可用为false
 */
const checkJsApi = (query) => {
  return new Promise(async (resolve, reject) => {
    if (!query || !query.jsApiList) {
      reject("jsApiList未传参");
      return;
    }
    wx.checkJsApi({
      jsApiList: query.jsApiList,
      complete: function (res) {
        resolve(res)
        console.log("当前客户端版本是否支持指定JS接口----", res);
      },
    });
  })
}





/**
 *  @func 获取用户数据信息
 *  @desc 调用agentConfig之前，必须确保先成功调用config
 *  @param {string} agentid 必填，企业应用的WX_APP_ID
 *  @returns {Promise} 返回一个Promise
 */
const getCurrentUser = (params) => {
  initEruda();
  return new Promise(async (resolve, reject) => {
    if (params) setAppId(params)
    const appId = getAppId() || params
    try {
      const res = await api.getCurrentUser(appId)
      console.log('getCurrentUser----', res)
      resolve(res)
    } catch (error) {
      reject(error)
    }
  })
}


export default {
  wxConfig,
  agentConfig,
  checkJsApi,
  getCurrentUser,
  loadJweixinJS,
  initEruda
}